#include "uart_drv.h"

static void GpioInit(void)
{
    /* 使能 GPIO 时钟源 */ 
    rcu_periph_clock_enable(GPIO_RXD_CLK);
    rcu_periph_clock_enable(GPIO_TXD_CLK);

    /* 复用引脚为 USARTx_Tx */
    gpio_af_set(GPIO_RXD_PORT, GPIO_RXD_AF, GPIO_TXD_PIN);

    /* 复用引脚为 USARTx_Rx */
    gpio_af_set(GPIO_TXD_PORT, GPIO_TXD_AF, GPIO_RXD_PIN);

    /* 设置引脚为上拉复用 */
    gpio_mode_set(GPIO_TXD_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_TXD_PIN);
    gpio_output_options_set(GPIO_TXD_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_TXD_PIN);

    /* 设置引脚为上拉复用 */
    gpio_mode_set(GPIO_RXD_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_RXD_PIN);
    gpio_output_options_set(GPIO_RXD_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_RXD_PIN);
}

static void UartInit(void)
{
    /* 使能 UART 时钟源 */ 
    rcu_periph_clock_enable(UART_CLK);

    /* USART 配置 */
    usart_deinit(UART_NUMBER);
    usart_baudrate_set(UART_NUMBER, UART_BAUDRATE);
    usart_receive_config(UART_NUMBER, USART_RECEIVE_ENABLE);
    usart_transmit_config(UART_NUMBER, USART_TRANSMIT_ENABLE);
    usart_enable(UART_NUMBER);
}

void UartDrvInit(void)
{
    GpioInit();
    UartInit();
}

/* retarget the C library printf function to the USART */
int fputc(int ch, FILE *f)
{
    usart_data_transmit(UART_NUMBER, (uint8_t)ch);
    while (RESET == usart_flag_get(UART_NUMBER, USART_FLAG_TBE))
        ;
    return ch;
}

void UartDrvTest(void)
{
    printf("UartDrvTest\r\n");
    printf("123!!!\r\n");
}
